#pragma once
#include "Common.hpp"

class InetAddr
{

public:
    InetAddr(struct sockaddr_in &addr)
        : _addr(addr)
    {
        _port = ntohs(addr.sin_port);
        char buffer[1024];
        inet_ntop(AF_INET,&addr.sin_addr,buffer,sizeof(buffer));
        _ip=buffer;

    }

    InetAddr(std::string ip, int port)
    :_ip(ip),
    _port(port)
    {
        memset(&_addr,0,sizeof(_addr));
        _addr.sin_family=AF_INET;
        _addr.sin_port=htons(_port);
        inet_pton(AF_INET,ip.c_str(),&_addr.sin_addr);

    }

    InetAddr(int port)
    :_port(port)
    {
        memset(&_addr,0,sizeof(_addr));
        _addr.sin_family=AF_INET;
        _addr.sin_port=htons(_port);
        _addr.sin_addr.s_addr=INADDR_ANY;

    }

    // 返回端口号
    uint16_t Port()
    {
        return _port;
    }

    // 返回套接字
    std::string StringAddr()
    {
        return _ip+" "+std::to_string(_port);
    }


    // 返回sockaddr指针
    struct sockaddr* GetAddr()
    {
        return (sockaddr*)&_addr;
    }

    // 返回sockaddr_in引用
    struct sockaddr_in& GetSockAddr_in()
    {
        return _addr;
    }


    // 返回套接字结构体大小
    int SockLen()
    {
        return sizeof(_addr);
    }

    // 运算符重载函数
    bool operator==(InetAddr& addr)
    {
        return _ip==addr._ip && _port==addr._port;
    }

private:
    struct sockaddr_in _addr;
    std::string _ip;
    uint16_t _port;
};